﻿using System;
using System.Drawing;

namespace Potoshon
{
    internal class Preprocessing
    {
        // Шум
        public static void Noise(Bitmap img, int N)
        {
            var rnd = new Random((int) DateTime.Now.Ticks);
            int x, y;
            var c = new Color();

            for (int i = 0; i < N; i++)
            {
                x = rnd.Next(img.Width);
                y = rnd.Next(img.Height);
                c = Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255));

                img.SetPixel(x, y, c);
            }
        }

        // Бинаризация
        public static void Monochrome(Bitmap img, byte threshold)
        {
            int i, j;
            byte[,] brig = Histogram.CreateBrightMap(img);

            for (i = 0; i < img.Height; i++)
            {
                for (j = 0; j < img.Width; j++)
                {
                    if (brig[i, j] > threshold)
                        img.SetPixel(j, i, Color.White);
                    else
                        img.SetPixel(j, i, Color.Black);
                }
            }
        }

        //Оттенки серого
        public static void GrayScale(Bitmap img)
        {
            int i, j;
            byte[,] brig = Histogram.CreateBrightMap(img);

            for (i = 0; i < img.Height; i++)
            {
                for (j = 0; j < img.Width; j++)
                {
                    img.SetPixel(j, i, Color.FromArgb(brig[i, j], brig[i, j], brig[i, j]));
                }
            }
        }

        // Негатив
        public static void Negativ(Bitmap img)
        {
            int i, j;
            var c = new Color();
            for (i = 0; i < img.Height; i++)
            {
                for (j = 0; j < img.Width; j++)
                {
                    c = img.GetPixel(j, i);
                    img.SetPixel(j, i, Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B));
                }
            }
        }

        // Изменение контраста
        public static void Contrast(Bitmap img, double K)
        {
            int i, j;
            int BBr, GBr, RBr;
            var c = new Color();

            for (i = 0; i < img.Height; i++)
            {
                for (j = 0; j < img.Width; j++)
                {
                    c = img.GetPixel(j, i);

                    // Канал синего
                    BBr = (int) ((c.B - Histogram.AvgBBr)*K + Histogram.AvgBBr + 0.5);
                    if (BBr > 255) BBr = 255;
                    else if (BBr < 0) BBr = 0;

                    // Канал зелёного
                    GBr = (int) ((c.G - Histogram.AvgGBr)*K + Histogram.AvgGBr + 0.5);
                    if (GBr > 255) GBr = 255;
                    else if (GBr < 0) GBr = 0;

                    // Канал красного
                    RBr = (int) ((c.R - Histogram.AvgRBr)*K + Histogram.AvgRBr + 0.5);
                    if (RBr > 255) RBr = 255;
                    else if (RBr < 0) RBr = 0;

                    img.SetPixel(j, i, Color.FromArgb(RBr, GBr, BBr));
                }
            }
        }

        // Изменение яркости
        public static void Bright(Bitmap img, short Val)
        {
            int i, j;
            int r, g, b;
            var c = new Color();
            for (i = 0; i < img.Height; i++)
            {
                for (j = 0; j < img.Width; j++)
                {
                    c = img.GetPixel(j, i);
                    r = c.R + Val;
                    g = c.G + Val;
                    b = c.B + Val;
                    if (r > 255) r = 255;
                    else if (r < 0) r = 0;
                    if (g > 255) g = 255;
                    else if (g < 0) g = 0;
                    if (b > 255) b = 255;
                    else if (b < 0) b = 0;

                    img.SetPixel(j, i, Color.FromArgb(r, g, b));
                }
            }
        }
    }
}